/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.Oracle;

import Persistencia.Entidades.BoletaSenasa;
import Persistencia.Entidades.Sanitario;
import Persistencia.ISanitarioDAO;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import oracle.jdbc.OraclePreparedStatement;
import oracle.jdbc.OracleTypes;
import utilidades.FormatDateString;

/**
 * La SanitarioOracleDAO se encarga de la insercción, eliminación y actualización
 * de los Sanitario en la Base de Datos Oracle.
 *
 * La SanitarioOracleDAO se encarga de la recuperación de los Sanitarios de la
 * Base de Datos Oracle.
 *
 * Ofrece la correspondencia Objeto Relacional entre un Objeto Entidad Sanitario con
 * las tablas relacionales de la base de datos Oracle.
 * @author zeta
 */
public class SanitarioOracleDAO implements ISanitarioDAO {

    private static SanitarioOracleDAO INSTANCE = null;
    /*
     * El contrustcor private no permite que se genere un constructor por defecto
     */

    private SanitarioOracleDAO() {
    }

    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new SanitarioOracleDAO();
        }
    }

    /**
     * Retorna una instamcio de SanitarioOracleDAO asegurandose que no se cree mas
     * de un objeto de esta clase. Modelando el patron Singleton
     */
    public static SanitarioOracleDAO getInstance() {
        if (INSTANCE == null) {
            createInstance();
        }
        return INSTANCE;
    }

    public Integer insertSanitario(Sanitario sanitario) {
        String sql = "INSERT INTO SANITARIOS (NUM_SANITARIO,ID_EXPORTADOR,"
                + "ID_IMPORTADOR,PROVISORIO,FECHA_EMISION,FECHA_FIRMA,"
                + "ID_RESPONSABLE,ID_RESPONSABLE_SENASA,VALOR,"
                + "ID_TRANSPORTE,PLACAS ) "
                + "VALUES(?,?,?,?,TO_DATE(?, 'DD/MM/RRRR'),TO_DATE(?, 'DD/MM/RRRR'),?,?,?,?,?) RETURNING NUM_SANITARIO INTO ? ";
        Connection conn = OracleDAOFactory.getConnection();
        try {


            OraclePreparedStatement pst = (OraclePreparedStatement) conn.prepareStatement(sql);
            pst.setInt(1, sanitario.getNumSanitario());
            pst.setInt(2, sanitario.getIdExportador().getIdExportador());
            pst.setInt(3, sanitario.getIdImportador().getIdImportador());
            pst.setString(4, sanitario.getProvisorio());
            pst.setString(5, FormatDateString.deDateString(sanitario.getFechaEmision()));
            pst.setString(6, FormatDateString.deDateString(sanitario.getFechaFirma()));
            pst.setInt(7, sanitario.getIdResponsable().getIdResponsable());
            pst.setInt(8, sanitario.getIdResponsableSenasa().getIdResponsable());
            pst.setFloat(9, sanitario.getValor());
            pst.setInt(10, sanitario.getIdTransporte().getIdTransporte());
            pst.setString(11, sanitario.getPlacas());

            pst.registerReturnParameter(12, OracleTypes.NUMBER);
            //inicia Transaccion
            pst.executeUpdate();

            ResultSet rs = pst.getReturnResultSet();
            if (rs.next()) {
                return rs.getInt(1);
            }
            return null;
        } catch (SQLException ex) {

            ex.printStackTrace();
            return null;
        } finally {
            try {
                conn.setAutoCommit(true);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    public boolean updateSanitario(Sanitario sanitario) {
        String sql = "UPDATE  SANITARIOS SET ID_EXPORTADOR = ?"
                + "ID_IMPORTADOR=?,PROVISORIO=?,FECHA_EMISION=TO_DATE(?, 'DD/MM/RRRR'),FECHA_FIRMA=TO_DATE(?, 'DD/MM/RRRR'),"
                + "ID_RESPONSABLE=?,ID_RESPONSABLE_SENASA=?,VALOR=?,"
                + "ID_TRANSPORTE=?,PLACAS=? WHERE NUM_SANITARIO=?";

        Connection conn = OracleDAOFactory.getConnection();
        try {


            OraclePreparedStatement pst = (OraclePreparedStatement) conn.prepareStatement(sql);

            pst.setInt(1, sanitario.getIdExportador().getIdExportador());
            pst.setInt(2, sanitario.getIdImportador().getIdImportador());
            pst.setString(3, sanitario.getProvisorio());
            pst.setString(4, FormatDateString.deDateString(sanitario.getFechaEmision()));
            pst.setString(5, FormatDateString.deDateString(sanitario.getFechaFirma()));
            pst.setInt(6, sanitario.getIdResponsable().getIdResponsable());
            pst.setInt(7, sanitario.getIdResponsableSenasa().getIdResponsable());
            pst.setFloat(8, sanitario.getValor());
            pst.setInt(9, sanitario.getIdTransporte().getIdTransporte());
            pst.setString(10, sanitario.getPlacas());
            pst.setInt(11, sanitario.getNumSanitario());
            pst.executeUpdate();



            return true;

        } catch (SQLException ex) {

            ex.printStackTrace();
            return false;
        } finally {
            try {
                conn.setAutoCommit(true);
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    public boolean deleteSanitario(Sanitario sanitario) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Sanitario getSanitario(Integer numSanitario, boolean conBoletaSenasa) {
        String sql = "SELECT NUM_SANITARIO,  ID_EXPORTADOR,  ID_IMPORTADOR,"
                + "  PROVISORIO,  FECHA_EMISION,  FECHA_FIRMA,  ID_RESPONSABLE, "
                + " ID_RESPONSABLE_SENASA,  VALOR,  ID_TRANSPORTE,  PLACAS FROM SANITARIOS WHERE NUM_SANITARIO=?";
        Connection conn = OracleDAOFactory.getConnection();
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) conn.prepareStatement(sql);
            pst.setInt(1, numSanitario);
            ResultSet rs = pst.executeQuery();
            if (rs.next()) {
                Sanitario sanitario = new Sanitario();
                sanitario.setNumSanitario(rs.getInt("NUM_SANITARIO"));
                sanitario.setIdExportador(ExportadorOracleDAO.getInstance().getExportador(rs.getInt("ID_EXPORTADOR")));
                sanitario.setIdImportador(ImportadorOracleDAO.getInstance().getImportador(rs.getInt("ID_IMPORTADOR")));
                sanitario.setProvisorio(rs.getString("PROVISORIO"));
                sanitario.setFechaEmision(new java.util.Date(rs.getDate("FECHA_EMISION").getTime()));
                sanitario.setFechaFirma(rs.getDate("FECHA_FIRMA") == null ? null : new java.util.Date(rs.getDate("FECHA_FIRMA").getTime()));
                sanitario.setIdResponsable(ResponsableOracleDAO.getInstance().getResponsable(rs.getInt("ID_RESPONSABLE")));
                sanitario.setIdResponsableSenasa(rs.getObject("ID_RESPONSABLE_SENASA") == null ? null : ResponsableSenasaOracleDAO.getInstance().getResponsableSenasa(rs.getInt("ID_RESPONSABLE_SENASA")));
                sanitario.setValor(rs.getFloat("VALOR"));
                sanitario.setIdTransporte(TransporteOracleDAO.getInstance().getTransporte(rs.getInt("ID_TRANSPORTE")));
                sanitario.setPlacas(rs.getString("PLACAS"));
                if (conBoletaSenasa) {
                    BoletaSenasaOracleDAO.getInstance().getAllBoletasSenasa(sanitario, false);
                }
                return sanitario;
            } else {
                return null;
            }
        } catch (SQLException ex) {

            ex.printStackTrace();
            return null;
        }
    }

    public List<Sanitario> getAllSanitarios(boolean conBoletaSenasa) {
        String sql = "SELECT NUM_SANITARIO,  ID_EXPORTADOR,  ID_IMPORTADOR,"
                + "  PROVISORIO,  FECHA_EMISION,  FECHA_FIRMA,  ID_RESPONSABLE, "
                + " ID_RESPONSABLE_SENASA,  VALOR,  ID_TRANSPORTE,  PLACAS FROM SANITARIOS";
        Connection conn = OracleDAOFactory.getConnection();
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            List<Sanitario> lSanitario = new ArrayList<Sanitario>();
            while (rs.next()) {
                Sanitario sanitario = new Sanitario();
                sanitario.setNumSanitario(rs.getInt("NUM_SANITARIO"));
                sanitario.setIdExportador(ExportadorOracleDAO.getInstance().getExportador(rs.getInt("ID_EXPORTADOR")));
                sanitario.setIdImportador(ImportadorOracleDAO.getInstance().getImportador(rs.getInt("ID_IMPORTADOR")));
                sanitario.setProvisorio(rs.getString("PROVISORIO"));
                sanitario.setFechaEmision(new java.util.Date(rs.getDate("FECHA_EMISION").getTime()));
                sanitario.setFechaFirma(rs.getDate("FECHA_FIRMA") == null ? null : new java.util.Date(rs.getDate("FECHA_FIRMA").getTime()));
                sanitario.setIdResponsable(ResponsableOracleDAO.getInstance().getResponsable(rs.getInt("ID_RESPONSABLE")));
                sanitario.setIdResponsableSenasa(rs.getObject("ID_RESPONSABLE_SENASA") == null ? null : ResponsableSenasaOracleDAO.getInstance().getResponsableSenasa(rs.getInt("ID_RESPONSABLE_SENASA")));
                sanitario.setValor(rs.getFloat("VALOR"));
                sanitario.setIdTransporte(TransporteOracleDAO.getInstance().getTransporte(rs.getInt("ID_TRANSPORTE")));
                sanitario.setPlacas(rs.getString("PLACAS"));
                if (conBoletaSenasa) {
                    BoletaSenasaOracleDAO.getInstance().getAllBoletasSenasa(sanitario, false);
                }
                lSanitario.add(sanitario);
            }
            return lSanitario;
        } catch (SQLException ex) {

            ex.printStackTrace();
            return null;
        }
    }

    public boolean getAllSanitarios(BoletaSenasa boletaSenasa, boolean conBoletaSenasa) {
        String sql = "SELECT NUM_SANITARIO FROM SANITARIOBOLETAS WHERE NUM_BOLETA = ?";

        Connection conn = OracleDAOFactory.getConnection();
        try {

            OraclePreparedStatement pst = (OraclePreparedStatement) conn.prepareStatement(sql);
            pst.setInt(1, boletaSenasa.getNumBoleta());
            ResultSet rs = pst.executeQuery();
            List<Sanitario> lSanit = new ArrayList();
            while (rs.next()) {
                Sanitario sanit = getSanitario(rs.getInt("NUM_SANITARIO"), false);
                lSanit.add(sanit);
            }
            boletaSenasa.setSanitariosList(lSanit);
            return true;
        } catch (SQLException ex) {
            ex.printStackTrace();
            return false;
        }
    }

    public List<Sanitario> getAllSanitariosSinBoletas() {
        String sql = "SELECT NUM_SANITARIO,  ID_EXPORTADOR,  ID_IMPORTADOR,"
                + "  PROVISORIO,  FECHA_EMISION,  FECHA_FIRMA,  ID_RESPONSABLE, "
                + " ID_RESPONSABLE_SENASA,  VALOR,  ID_TRANSPORTE,  PLACAS "
                + "FROM SANITARIOS WHERE NOT EXISTS (SELECT NUM_SANITARIO FROM "
                + "SANITARIOBOLETAS WHERE "
                + "SANITARIOS.NUM_SANITARIO = SANITARIOBOLETAS.NUM_SANITARIO) ";
        Connection conn = OracleDAOFactory.getConnection();
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            List<Sanitario> lSanitario = new ArrayList<Sanitario>();
            while (rs.next()) {
                Sanitario sanitario = new Sanitario();
                sanitario.setNumSanitario(rs.getInt("NUM_SANITARIO"));
                sanitario.setIdExportador(ExportadorOracleDAO.getInstance().getExportador(rs.getInt("ID_EXPORTADOR")));
                sanitario.setIdImportador(ImportadorOracleDAO.getInstance().getImportador(rs.getInt("ID_IMPORTADOR")));
                sanitario.setProvisorio(rs.getString("PROVISORIO"));
                sanitario.setFechaEmision(new java.util.Date(rs.getDate("FECHA_EMISION").getTime()));
                sanitario.setFechaFirma(rs.getDate("FECHA_FIRMA") == null ? null : new java.util.Date(rs.getDate("FECHA_FIRMA").getTime()));
                sanitario.setIdResponsable(ResponsableOracleDAO.getInstance().getResponsable(rs.getInt("ID_RESPONSABLE")));
                sanitario.setIdResponsableSenasa(rs.getObject("ID_RESPONSABLE_SENASA") == null ? null : ResponsableSenasaOracleDAO.getInstance().getResponsableSenasa(rs.getInt("ID_RESPONSABLE_SENASA")));
                sanitario.setValor(rs.getFloat("VALOR"));
                sanitario.setIdTransporte(TransporteOracleDAO.getInstance().getTransporte(rs.getInt("ID_TRANSPORTE")));
                sanitario.setPlacas(rs.getString("PLACAS"));

                lSanitario.add(sanitario);
            }
            return lSanitario;
        } catch (SQLException ex) {

            ex.printStackTrace();
            return null;
        }
    }

    public List<Sanitario> getAllSanitariosConBoletas(boolean conBoletaSenasa) {
        String sql = "SELECT NUM_SANITARIO,  ID_EXPORTADOR,  ID_IMPORTADOR,"
                + "  PROVISORIO,  FECHA_EMISION,  FECHA_FIRMA,  ID_RESPONSABLE, "
                + " ID_RESPONSABLE_SENASA,  VALOR,  ID_TRANSPORTE,  PLACAS "
                + "FROM SANITARIOS WHERE  EXISTS (SELECT NUM_SANITARIO FROM "
                + "SANITARIOBOLETAS WHERE "
                + "SANITARIOS.NUM_SANITARIO = SANITARIOBOLETAS.NUM_SANITARIO) ";
        Connection conn = OracleDAOFactory.getConnection();
        try {
            OraclePreparedStatement pst = (OraclePreparedStatement) conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            List<Sanitario> lSanitario = new ArrayList<Sanitario>();
            while (rs.next()) {
                Sanitario sanitario = new Sanitario();
                sanitario.setNumSanitario(rs.getInt("NUM_SANITARIO"));
                sanitario.setIdExportador(ExportadorOracleDAO.getInstance().getExportador(rs.getInt("ID_EXPORTADOR")));
                sanitario.setIdImportador(ImportadorOracleDAO.getInstance().getImportador(rs.getInt("ID_IMPORTADOR")));
                sanitario.setProvisorio(rs.getString("PROVISORIO"));
                sanitario.setFechaEmision(new java.util.Date(rs.getDate("FECHA_EMISION").getTime()));
                sanitario.setFechaFirma(rs.getDate("FECHA_FIRMA") == null ? null : new java.util.Date(rs.getDate("FECHA_FIRMA").getTime()));
                sanitario.setIdResponsable(ResponsableOracleDAO.getInstance().getResponsable(rs.getInt("ID_RESPONSABLE")));
                sanitario.setIdResponsableSenasa(rs.getObject("ID_RESPONSABLE_SENASA") == null ? null : ResponsableSenasaOracleDAO.getInstance().getResponsableSenasa(rs.getInt("ID_RESPONSABLE_SENASA")));
                sanitario.setValor(rs.getFloat("VALOR"));
                sanitario.setIdTransporte(TransporteOracleDAO.getInstance().getTransporte(rs.getInt("ID_TRANSPORTE")));
                sanitario.setPlacas(rs.getString("PLACAS"));

                lSanitario.add(sanitario);
            }
            return lSanitario;
        } catch (SQLException ex) {

            ex.printStackTrace();
            return null;
        }
    }
}
